#ifndef NETWORK_CONNECTIONPOOL_H_
#define NETWORK_CONNECTIONPOOL_H_

#include "ClientConnection.h"

#include <boost/ptr_container/ptr_array.hpp>
#include <iostream>
#include <string>

// deklarasja klasy Command... deklaracja zawczasu
namespace Commands {
	class Command;
}

namespace Network {

const int MAX_CONN = 10;

/*
 * Kontener przechowujacy polaczenia.
 */
class ConnectionPool {
public:
	typedef boost::ptr_array<ClientConnection,MAX_CONN> ConnectionList;
	typedef ConnectionList::iterator ConnectionListIter;
private:
	static const int DEFAULT_PORT = 24000;
	// List using smart pointers
	ConnectionList connections;
	int numberOfElements;

	ConnectionPool();
	ConnectionPool(const ConnectionPool&);
	~ConnectionPool();

public:
	static ConnectionPool& getInstance() {
		static ConnectionPool instance;
		return instance;
	}

	// Zwraca pierwsza wolna pozycje w kontenerze
	int getPosition();

	ConnectionList* getAll();

	// Umieszcza polaczenie w kontenerze na
	// odpowiedniej pozycji
	void addConnection(ClientConnection* cC, int pos);

	// Zwraca polaczenie z wybranym adresem
	ClientConnection* getConnection(std::string from);

	// Zwraca ilosc elementow. Mozna uzyc tez zmiennej
	// statycznej. Istnieje jednak wtedy niebezpieczenstwo
	// wyscigu dostepu miedzy watkami
	int count();

	// Sprawdza czy kontener jest pelny
	bool isFull();

	// Rozsyla komende do wszystkich podlaczonych klientow
	void broadcast( Commands::Command* );

}; //class ConnectionPool

} //namespace Network

#endif /* NETWORK_CONNECTIONPOOL_H_ */
